#include "../HardWare/exti.h"
#include "stm32f10x.h"
#include "sys.h" //使用位带操作
#include "stm32f10x_exti.h"
#include "../SYSTEM/usart/usart.h" //使用printf 函数
#include "../HardWare/led.h"
#include "../SYSTEM/delay/delay.h"

/*
    本代码主要用于CH376S中断引脚测试。
    目前已成功测试跳变沿触发，还未经过CH376S芯片U盘插入拔出测试。 跳变沿测试时间：2017-3-29
*/


void EXITIX_Init(void)
{
    GPIO_InitTypeDef GPIO_initstruct;
    EXTI_InitTypeDef EXTI_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;

    //开启AFIO时钟 &GPIOA 时钟
    // RCC_APB2PeriphResetCmd(RCC_APB2Periph_AFIO |RCC_APB2Periph_GPIOA,ENABLE);  //擦 把GPIOA的时钟给reset了。。。GG
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOA, ENABLE);

    {
        GPIO_initstruct.GPIO_Speed = GPIO_Speed_10MHz;
        GPIO_initstruct.GPIO_Pin = GPIO_Pin_1;
        GPIO_initstruct.GPIO_Mode = GPIO_Mode_IPU; //上拉输入
        GPIO_Init(GPIOA, &GPIO_initstruct);
    }

    GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource1); //PA1 作为外部中断引脚
    {
        EXTI_InitStructure.EXTI_Line = EXTI_Line1;
        EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
        EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling; //跳变沿触发中断
        EXTI_InitStructure.EXTI_LineCmd = ENABLE;
        EXTI_Init(&EXTI_InitStructure);
    }

    {
        NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);
    }
}

void EXTI1_IRQHandler(void)
{
    if (EXTI_GetITStatus(EXTI_Line1) != RESET)
    {   
        //可能点评有毛刺，要加大延时函数。
        delay_ms(20);
        if (PAin(1) == 1) //上升沿
        {
            led1 = 1; //灯灭,U盘拔出
            printf("U盘拔出。\r\n");
        }
        else if (PAin(1) == 0) //下降沿
        {
            led1 = 0; //灯亮，U盘插入
            printf("u盘插入。\r\n");
        }
        EXTI_ClearITPendingBit(EXTI_Line1); //清除中断标志位。
    }
    else
        printf("外部中断处理函数出错。\r\n");
}
